package com.mindskip.xzs.controller.admin;
//管理和处理与任务考试相关的操作。任务考试的创建、编辑、删除、分页查询等操作。
//分页查询任务考试列表（`/api/admin/task/page` 和 `/api/admin/task/pageList`）
//前端发送POST请求到`/api/admin/task/page`或`/api/admin/task/pageList`，请求体包含分页查询参数。
//后端返回分页后的任务考试列表，前端将其展示在页面上。
//获取特定任务考试的详情（`/api/admin/task/select/{id}`）
//前端发送POST请求到`/api/admin/task/select/{id}`，路径参数`id`为任务考试的ID。
//后端返回指定ID的任务考试详情，前端展示任务考试的详细信息。
//编辑任务考试（`/api/admin/task/edit`）
//前端发送POST请求到`/api/admin/task/edit`，请求体包含需要编辑的任务考试信息。
//后端返回编辑后的任务考试信息，前端更新页面上的任务考试信息。
//删除任务考试（`/api/admin/task/delete/{id}`
//前端发送POST请求到`/api/admin/task/delete/{id}`，路径参数`id`为任务考试的ID。
//后端返回操作结果，前端更新页面，移除被删除的任务考试
//获取任务考试列表（`/api/admin/task/list/{batchId}`
//前端发送GET请求到`/api/admin/task/list/{batchId}`，路径参数`batchId`为批次ID。
//后端返回任务考试列表及其相关的试卷信息，前端展示任务考试及其试卷信息。
//分页查询任务考试列表
//方法`pageList`和`pageLists`处理分页查询请求，调用`taskExamService`服务获取任务考试的分页数据，并进行数据转换后返回给前端。
//获取特定任务考试的详情
//方法`select`处理获取任务考试详情的请求，调用`taskExamService`服务获取指定ID的任务考试信息，并返回任务考试的详细信息。
//编辑任务考试
//方法`edit`处理编辑任务考试的请求，调用`taskExamService`服务更新任务考试信息，并返回编辑后的任务考试信息。
//删除任务考试
//方法`delete`处理删除任务考试的请求，调用`taskExamService`服务标记任务考试为删除状态，并更新数据库。
//获取任务考试列表及相关信息
//方法`task`处理获取任务考试列表的请求，调用`taskServer`服务获取任务考试列表及其相关的试卷信息，并返回任务考试及其试卷信息。

import com.mindskip.xzs.base.BaseApiController;
import com.mindskip.xzs.base.RestResponse;
import com.mindskip.xzs.domain.TaskExam;
import com.mindskip.xzs.domain.TaskExamCustomerAnswer;
import com.mindskip.xzs.domain.TextContent;
import com.mindskip.xzs.domain.User;
import com.mindskip.xzs.domain.task.TaskItemAnswerObject;
import com.mindskip.xzs.domain.task.TaskItemObject;
import com.mindskip.xzs.service.TaskExamCustomerAnswerService;
import com.mindskip.xzs.service.TaskExamService;
import com.mindskip.xzs.service.TaskServer;
import com.mindskip.xzs.service.TextContentService;
import com.mindskip.xzs.utility.DateTimeUtil;
import com.mindskip.xzs.utility.JsonUtil;
import com.mindskip.xzs.utility.PageInfoHelper;
import com.mindskip.xzs.viewmodel.admin.task.TaskPageRequestVM;
import com.mindskip.xzs.viewmodel.admin.task.TaskPageResponseVM;
import com.mindskip.xzs.viewmodel.admin.task.TaskPageResponseVMN;
import com.mindskip.xzs.viewmodel.admin.task.TaskRequestVM;
import com.github.pagehelper.PageInfo;
import com.mindskip.xzs.viewmodel.student.dashboard.TaskItemPaperVm;
import com.mindskip.xzs.viewmodel.student.dashboard.TaskItemVm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import javax.websocket.server.PathParam;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@RestController("AdminTaskController") // 标注为RESTful控制器，bean名称为AdminTaskController
@RequestMapping(value = "/api/admin/task") // 设置请求映射路径
public class TaskController extends BaseApiController {

    private final TaskExamService taskExamService; // 任务考试服务类
    private final TaskExamCustomerAnswerService taskExamCustomerAnswerService; // 任务考试客户答题服务类
    private final TextContentService textContentService; // 文本内容服务类

    @Resource
    private TaskServer taskServer; // 任务服务器

    @Autowired
    public TaskController(TaskExamService taskExamService, TaskExamCustomerAnswerService taskExamCustomerAnswerService, TextContentService textContentService) {
        this.taskExamService = taskExamService;
        this.taskExamCustomerAnswerService = taskExamCustomerAnswerService;
        this.textContentService = textContentService;
    }

    @RequestMapping(value = "/page", method = RequestMethod.POST)
    public RestResponse<PageInfo<TaskPageResponseVM>> pageList(@RequestBody TaskPageRequestVM model) {
        PageInfo<TaskExam> pageInfo = taskExamService.page(model); // 分页获取任务考试信息
        PageInfo<TaskPageResponseVM> page = PageInfoHelper.copyMap(pageInfo, m -> {
            TaskPageResponseVM vm = modelMapper.map(m, TaskPageResponseVM.class);
            vm.setCreateTime(DateTimeUtil.dateFormat(m.getCreateTime())); // 格式化创建时间
            return vm;
        });
        return RestResponse.ok(page); // 返回分页信息
    }

    @RequestMapping(value = "/pageList", method = RequestMethod.POST)
    public RestResponse<TaskPageResponseVMN> pageLists(@RequestBody TaskPageRequestVM model) {
        return RestResponse.ok(taskServer.pageList(model)); // 返回任务分页列表
    }

    @RequestMapping(value = "/list/{batchId}", method = RequestMethod.GET)
    public RestResponse<List<TaskItemVm>> task(@PathVariable String batchId) {
        User user = getCurrentUser(); // 获取当前用户
        List<TaskExam> taskExams = taskServer.getTaskExamOnly(batchId); // 获取任务考试列表
        if (taskExams.size() == 0) {
            return RestResponse.ok(new ArrayList<>()); // 如果没有任务考试，返回空列表
        }
        List<Integer> tIds = taskExams.stream().map(taskExam -> taskExam.getId()).collect(Collectors.toList()); // 获取任务考试ID列表
        List<TaskExamCustomerAnswer> taskExamCustomerAnswers = taskExamCustomerAnswerService.selectByTUid(tIds, user.getId()); // 获取当前用户的任务考试答题列表
        List<TaskItemVm> vm = taskExams.stream().map(t -> {
            TaskItemVm itemVm = new TaskItemVm();
            itemVm.setId(t.getId()); // 设置任务ID
            itemVm.setTitle(t.getTitle()); // 设置任务标题
            TaskExamCustomerAnswer taskExamCustomerAnswer = taskExamCustomerAnswers.stream()
                    .filter(tc -> tc.getTaskExamId().equals(t.getId())).findFirst().orElse(null); // 获取当前任务考试的客户答题信息
            List<TaskItemPaperVm> paperItemVMS = getTaskItemPaperVm(t.getFrameTextContentId(), taskExamCustomerAnswer); // 获取任务试卷信息
            itemVm.setPaperItems(paperItemVMS); // 设置任务试卷信息
            return itemVm;
        }).collect(Collectors.toList());
        return RestResponse.ok(vm); // 返回任务信息列表
    }

    private List<TaskItemPaperVm> getTaskItemPaperVm(Integer tFrameId, TaskExamCustomerAnswer taskExamCustomerAnswers) {
        TextContent textContent = textContentService.selectById(tFrameId); // 获取文本内容
        List<TaskItemObject> paperItems = JsonUtil.toJsonListObject(textContent.getContent(), TaskItemObject.class); // 将文本内容转换为任务项对象列表

        List<TaskItemAnswerObject> answerPaperItems = null;
        if (null != taskExamCustomerAnswers) {
            TextContent answerTextContent = textContentService.selectById(taskExamCustomerAnswers.getTextContentId()); // 获取客户答题文本内容
            answerPaperItems = JsonUtil.toJsonListObject(answerTextContent.getContent(), TaskItemAnswerObject.class); // 将客户答题文本内容转换为任务项答案对象列表
        }

        List<TaskItemAnswerObject> finalAnswerPaperItems = answerPaperItems;
        return paperItems.stream().map(p -> {
                    TaskItemPaperVm ivm = new TaskItemPaperVm();
                    ivm.setExamPaperId(p.getExamPaperId()); // 设置试卷ID
                    ivm.setExamPaperName(p.getExamPaperName()); // 设置试卷名称
                    if (null != finalAnswerPaperItems) {
                        finalAnswerPaperItems.stream()
                                .filter(a -> a.getExamPaperId().equals(p.getExamPaperId()))
                                .findFirst()
                                .ifPresent(a -> {
                                    ivm.setExamPaperAnswerId(a.getExamPaperAnswerId()); // 设置试卷答案ID
                                    ivm.setStatus(a.getStatus()); // 设置状态
                                });
                    }
                    return ivm;
                }
        ).collect(Collectors.toList());
    }

    @RequestMapping(value = "/edit", method = RequestMethod.POST)
    public RestResponse edit(@RequestBody @Valid TaskRequestVM model) {
        taskExamService.edit(model, getCurrentUser()); // 编辑任务考试信息
        TaskRequestVM vm = taskExamService.taskExamToVM(model.getId()); // 获取编辑后的任务考试信息
        return RestResponse.ok(vm);
    }

    @RequestMapping(value = "/select/{id}", method = RequestMethod.POST)
    public RestResponse<TaskRequestVM> select(@PathVariable Integer id) {
        TaskRequestVM vm = taskExamService.taskExamToVM(id); // 获取指定ID的任务考试信息
        return RestResponse.ok(vm);
    }

    @RequestMapping(value = "/delete/{id}", method = RequestMethod.POST)
    public RestResponse delete(@PathVariable Integer id) {
        TaskExam taskExam = taskExamService.selectById(id); // 获取指定ID的任务考试
        taskExam.setDeleted(true); // 标记为已删除
        taskExamService.updateByIdFilter(taskExam); // 更新任务考试信息
        return RestResponse.ok();
    }
}
